﻿// 3724. 街灯.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <memory.h>


using namespace std;
/*
https://www.acwing.com/problem/content/3727/

现在是基督降临节，在长为 N米的街道上有 M个街灯。

每个灯照亮了左边 K米，右边 K米。

也就是说，在 X 米处的灯，能照亮从 X−K到 X+K（含）。

当然，街道某处可能被多个灯照亮。

所有灯位于不同的位置。

问题在于有可能这些灯没法照亮整条街道。

你的任务是，确定最少还要加多少灯，使得整条街道都被照亮。

输入格式
输入包含多组测试数据。

每组数据第一行包含三个整数 N,M,K.

第二行包含 M个升序的整数，表示每个灯的位置。

输出格式
每组数据输出一行，一个整数，表示答案。

数据范围
1≤N≤1000
,
1≤M≤N
,
0≤K≤N
,
输入最多包含 100组数据。

输入样例：
5 2 2
1 5
5 1 2
2
输出样例：
0
1


30 3 1
2 3 7


*/

const int N = 1010;
int n, m, k;

struct SEGMENT {
	int l,  r;
}seg[N];

void solve() {
	int curr = 0; int ans = 0;
	if (k == 0) {
		cout << n-m  <<endl;
		return;
	}
	
	for (int i = 0; i < m; i++) {
		if (curr + 1 >= seg[i].l) {
			curr = max(curr, seg[i].r);
		}
		else {
			int dis = seg[i].l - curr-1;
			ans += dis / (2 * k+1);
			if (dis % (2 * k+1)) ans++;
			curr = max(curr, seg[i].r);
		}
	}

	if (curr < n) {
		int dis = n - curr;
		ans += dis / (2 * k + 1);
		if (dis % (2 * k + 1)) ans++;
		 
	}
	
	cout << ans << endl;

	return;
}


int main()
{
	while (cin >> n >> m >> k) {
		memset(seg, 0, sizeof seg);
		for (int i = 0; i < m; i++) {
			int t; cin >> t;
			seg[i].l = t - k; seg[i].r = t + k;
		}

		solve();
	}


	return 0;
}

 